#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "mpi.h"
#include "user.h"
#include "master.h"


int main(int argc, char **argv) {

 
    MPI_Init(0, 0);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    int cs_1 = ITERATION_NUMBER;  // ustalenie liczby iteracji przy jednym kroku temperaturowym 
    double T = (double) BODY_TEMP; // ustalenie temperatury początkowej
	int z; // zmienna robocza
	
    if (rank == 0) {	
        alokMemory();  //zaalokownaie pamięci 
		
		/*MB: a po co to?*/		
        bestResult = nextPoint() + ran(); // wylosowanie punktu początkowego 
        put(bestResult); // wysłanie do kolejki punktu dla którego trzeba policzyc koszt 
	}
	
	
	while(T>AMBIENT_TEMP){	
		if (rank==0){  // proces głowny w ktorym wykonywana jest algorytm SA 
			for (i=0; i<ITERATION_NUMBER ; i++){
				x= bestResult + ran();  // losowy wybor punktów (z domeny rozwiązania) będących saiadami aktualnego rozwiązania   
				put(x); // wysłanie do zarządcy kolejki procesów wartość dla któej ma zaostać wyliczona wartość funkcji kosztu, sygnał od procesu głownego do kolejki  		  
			}			    

			/*MB: wartość zmiennej Z się w ogóle nie zmienia, wartość COSTZ jest cały czas nadpisywana*/
			for (i=0 ; i<ITERATION_NUMBER ; i++){
				z = bestResult; // z jest zmienna robocza do ktorej przypisujemy aktualnie najlepszy wynik   
				get(); // sygnał o zapotrzebowaniu na koleją wartość, sygnał do kolejki 	
			 	costZ = reciveGet();  // odebranie wartośći funkcji kosztu, sygnał zwrotny od kolejki procesów do procesu głownego 
			}
			
			/*MB: to chyba nie jest w C */
			if task(costX,costZ,T){
				then x := z   //sprawdzenie najmniejszego kosztu i ustanawianie obecnie optymalnego punktu
	 
			}
		} else if (rank==1) { 	 // tutaj działa zarządca kolejki procesów, zarzadzający podporcesami liczącymi funkcje kosztu  
			queque() // obsługa sygnałów przez kolejke procesów 
		} else {  // tutaj działają podprosecy wyliczające funkcję kosztu
			count_cost()//odbierz sygnał z i policz wartość, sygnał od kolejki do podprocesów 
		}
		T = DecrementTemp(T); // obniżenie temperatury 
	}	

    if (rank == 0) {   // po zakonczeniu działania algorytmu tj. osiągnięciu warunku stopu należy zwolinić zaalokowaną wcześniej pamięć i zakończyć działanie procesów 
        fprintf(stdout, "\n\nNajlepszy wynik to:%lf\n\n\n", result);
        freeMemory(); // zwolnienie uzywanych zasobów 
    }
	                        
    MPI_Finalize();
    return EXIT_SUCCESS;
}